<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    
</body>
<script>
//     function Parent() {
//     this.name = 'kiven'
// }

// Parent.prototype.getName = function() {
//     console.log(this.name)
// }

// function Child() {

// }

// Child.prototype = new Parent()

// var child1 = new Child()

// child1.getName()

// function Parent() {
//     this.names = ['kiven','daisy']
// }

// function Child() {

// }

// Child.prototype = new Parent()

// var child1 = new Child()

// child1.names.push('mary')

// console.log(child1.names)

// var child2 = new Child()

// console.log(child2.names)


// function Parent() {
//     this.names = ['kiven','daisy']
// }

// function Child() {
//     Parent.call(this)
// }

// var child1 = new Child()

// child1.names.push('mary')
// console.log(child1.names)

// var child2 = new Child()

// console.log(child2.names)

// function Parent(name) {
//     this.name = name
// }

// function Child(name) {
//     Parent.call(this,name)
// }

// var child1 = new Child('kiven')
// console.log(child1.name)

// var parent = new Parent('daiys')
// console.log(parent.name)

// function Parent(name) {
//     this.name = name;
//     this.colors = ['red','blue','green']
// }

// Parent.prototype.getName = function() {
//     console.log(this.name)
// }

// function Child(name,age) {
//     Parent.call(this,name)
//     this.age = age
// }

// Child.prototype = new Parent()
// let  child1 = new Child('kiven',18)

// child1.colors.push('yellow')
// console.log(child1.name) //kiven
// console.log(child1.age) // 18
// console.log(child1.colors) // ['red','blue','green','yellow']


// let child2 = new Child('mary',20)

// console.log(child2.name) // kiven
// console.log(child2.age) // 18
// console.log(child2.colors) // ['red','blue','green']

// function CreateObj(o) {
//     function F () {}
//     F.prototype = o
//     return new F()
// }

// var person = {
//     name:'kiven',
//     friends:['mary','daisy']
// }

// const person1 = CreateObj(person)
// const person2 = CreateObj(person)

// person1.name = 'taylor'

// console.log(person2.name) // 'kiven'
// console.log(person1)

// person1.friends.push('person')

// console.log(person2.friends) //['mary','daisy'，'person']


// function Person(name) {
//     this.name = name
//      this.colors = ['red', 'blue', 'green'];
// }

// Person.prototype.getName = function() {
//     console.log(this.name)
    
// }

// function Child(name,age) {
//     Person.call(this,name)
//     this.age = age
// }

// Child.prototype = new Person()

// var child1 = new Child('kiven',18)

// console.log(child1) 

// console.log(child1.name) //kiven
// console.log(child1.getName) //kiven


// function Parent(name) {
//     this.name = name
//     this.colors = ['red','green','bule']
// }

// Parent.prototype.getName = function() {
//     conosle.log(this.name)
// }

// function Child(name,age) {
//     Parent.call(this,name)
//     this.age = age
// }

// // 关键的三步

// var F =  function () {}

// F.prototype = new Parent()

// Child.prototype = new F()

// var child1 = new Child('kiven',18)

// console.log(child1)

// 原型链继承
//  function Parent () {
//      this.names = ['daisy']
//  }
//  Parent.prototype.getName = function() {
//      console.log(this.names)
//  }
//  function Child() {

//  }
//  var p1 = new Parent()
// Child.prototype = p1
// var c1 = new Child()
// c1.names.push('yayu');
// console.log(c1.names)
// // c1.getName()

// // 缺点引用类型的属性被所有实例共享
// var c2 = new Child()
// console.log(c2.names)
// 借用构造函数继承 (经典继承，call继承)
// function Parent() {
//     this.names = ['kiven','daisy']
// }

// function Child() {
//     Parent.call(this)
// }
// var c1 = new Child()
// c1.names.push('amani')
// console.log(c1.names)
// var c2 = new Child()
// c2.names.push('yayu')
// console.log(c2.names)

// 优点：1.避免了引用类型的属性被所有实例共享
//     2.可以在 Child 中向 Parent 传参
// function Parent (name) {
//     this.name = name
// }
// function Child(name) {
//     Parent.call(this,name)
// }
// var c1 = new Child('kiven')
// console.log(c1.name)
// var c2 = new Child('daisy')
// console.log(c2.name)

// 组合继承， 原型继承加构造函数继承(call继承)
function Parent (name) {
    this.name  = name
    this.colors = ['red','green','yellow']
}
Parent.prototype.getName = function () {
    console.log(this.name)
}
function Child (name) {
    Parent.call(this,name)
}

Child.prototype = new Parent()

var c1 = new Child('daisy')
c1
console.log(c1.name)

</script>
</html>